/*
 * @Description: 
 * @Version: 1.0
 * @Autor: ziwei
 * @Date: 2021-05-27 14:53:27
 * @LastEditors: ziwei
 * @LastEditTime: 2021-06-29 18:15:29
 */
import { isObject, mergeOptions } from "../utils";

export function initGlobalAPI(Vue) {
    Vue.options = {};//全局属性 每个组件初始化的时候 将这些属性放到每个组件桑

    Vue.mixin = function(options){
        this.options = mergeOptions(this.options,options);
        console.log(this.options);
        return this;
    }
    //vue.component -> Vue.extend
    Vue.options._base = Vue;
    //等会我通知Vue.extend方法可以产生一个子类 new子类的时候会执行代码初始化流程（组件的初始化）
    Vue.extend = function (opt) {//会产生一个子类
        const Super = this;
        const Sub = function (options) {//创造一个组件 其实就是new这个组件的类（组件的初始化）
            this._init(options)
        }
        Sub.prototype = Object.create(Super.prototype);//继承原型方法
        console.log(Sub);
        Sub.prototype.constructor = Sub;//Object.create 会产生一个新的实例作为子类的原型，此时constructior会指向错误 constructor就这个问题
        
        //父类的属性要和子类的属性进行合并
        Sub.options = mergeOptions(Super.options,opt);//需要让子类 能拿到我们Vue定义的全局组件
        //Sub.mixin = Vue.mixin; nextTixk等等
        return Sub;//产生Vue的子类
    }
    Vue.options.components = {};//存放全局组件的
    Vue.component = function name(id, definition) {//definition 可以传入对象或者函数
        let name = definition.name || id;
        definition.name = name;
        if(isObject(definition)){
            definition = Vue.extend(definition);
        }
        Vue.options.components[name] = definition;//缓存组件到全局上（维护关系）
        console.log(Vue.options.components);
    }
    Vue.filter = function name(params){

    }
    Vue.directive = function name(params){

    }
}